這幾天講的主軸是 Replication (數據複製),如果你的資料不會變動,做到 Replication 很簡單,只要把資料複製到別的節點就好了,搞定!
但資料可是會時時刻刻改變,所以這就是 Replication 的難處,處理改變後的副本資料,我們之後會詳細討論以下 3 種常見處理資料改變的方法:leader-base, multi-leader 和 leaderless 。
每一個 node (節點) 中儲存的資料庫複製資料稱為 replica ,在多台機器都有 replica 的情況下,我們要如何確保每一份 replica 都是最新的?每一次的資料庫寫入都應該在每份 replica 中也處理一次,否則 replica 的資料會不一樣;首先先來介紹一個很常見且又簡單的方法:leader-base replication (也可稱 master-slave replication),如下圖:
處理步驟為:
這個 Replication 模式已內建在許多 relational 資料庫中,像 PostgreSQL、MySQL、Oracle Data Guard 等等。
同步和非同步主要的差別如下圖,Follower 1 是同步,Follower 2 是非同步:
可以看到最大的差別就是 response time 的高低,同步就是需要每個 Follower 都回 Ok 後才會回覆 request 端,非同步就是通知 Follower 後就不等回覆了。
同步的好處是能確保所有 Followers 的資料都是最新的,壞處就是當 Follower 未回覆時 (可能是網路、Follower 掛掉或其他原因),Leader 的寫入會等待,然後卡到後面其他的寫入。
非同步的好處就是不怕 Follower 爛掉,但就不能確保資料是最新。
還有一種是 semi-synchronous ,也就是只有一台 Follower 是同步,其他 Followers 為非同步,如此起碼會有 2 台的資料都是最新,然後也不怕對 Leader 影響太大。
這裡來看看 leader-base 要怎麼加入新的 Follower 後,又能確保新 Follower 的資料是一致的,因為我們是 high availability (高可用性) 的系統,所以沒有 downtime 才是我們的重點!做法如下:
節點掛掉時怎辦?如何在 leader-based replication 方法維持 high availability (高可用性)?我們來分 2 個面向看。
Follower 掛掉時很單純,在 log 裡,每筆資料都有時間戳記,Follower 只要向 Leader 請求某個時間戳記後的所有資料變更就好了,直到該 Follower caught up 。
Leader 掛掉就比較有趣了,首先要從所有的 Followers 裡選出一個 Follower 當新的 Leader,然後 user 需重新設定新的 Leader,其他的 Follower 也改為向新 Leader 做資料變更,通常這個 process 稱為 Failover ,整個 Failover 的處理步驟如下:
檢查 Leader 是否掛掉:
當節點超過一定秒數後還未回覆,可視為死去。
選一個新的 Leader:
這裡有許多種選新 Leader 的方法,最好的方法為挑一個資料最新的 replica 當 Leader,讓資料遺失降到最小。
重設系統設定檔:
主要是讓相關系統知道新 Leader 誕生了,如果舊的 Leader 恢復,要能確保舊 Leader 能變成 Follower。
然而,Failover 也可能會遇到下述幾個問題:
明天繼續吧!